import base64
from concurrent import futures
import grpc

import data_pb2
import data_pb2_grpc


class FormatData(data_pb2_grpc.FormatDataServicer):
    # 重写接口函数
    def DoFormat(self, request, context):
        img = request.img
        # 对数据字符做base64解码
        cotent = base64.b64decode(bytes(img, encoding='utf-8'))
        with open('output.png', 'wb') as f:
            f.write(cotent)
        print("接受成功")
        return data_pb2.response(msg="传输成功")  # 返回一个类实例


def serve():
    # 定义服务器并设置最大连接数， corcurrent.futures是一个并发库，类似于线程池的概念
    grpcServer = grpc.server(futures.ThreadPoolExecutor(max_workers=4), options=[
        ('grpc.max_send_message_length', 256*1024*1024),   # 修改传输数据的大小限制，因为图片数据可能比较大
        ('grpc.max_receive_message_length', 256*1024*1024),
    ])  # 创建一个服务器
    data_pb2_grpc.add_FormatDataServicer_to_server(FormatData(), grpcServer)  # 在服务器中添加派生的接口服务(自己实现了处理函数)
    grpcServer.add_insecure_port('[::]:10086')
    grpcServer.start()
    grpcServer.wait_for_termination()


if __name__ == '__main__':
    serve()
